package com.tlgen.orm.utils;

import java.util.StringJoiner;

/**
 * 高性能安全的字符串处理工具类
 */
public class StringUtils {

    // 私有构造器防止实例化
    private StringUtils() {}

    /**
     * 将类名转换为表名（安全高效版）
     * 如: MyTestName -> my_test_name
     *
     * @param clazz 类对象
     * @return 表名字符串，如果输入为null返回空字符串
     */
    public static String classNameToTableName(Class<?> clazz) {
        if (clazz == null) {
            return "";
        }

        String className = clazz.getSimpleName();
        return uncapUnderline(className);
    }

    /**
     * 将大写字母转换为小写并用下划线分隔（安全高效版）
     * 如: MyTestName -> my_test_name
     *
     * @param s 输入字符串
     * @return 转换后的字符串，如果输入为null返回空字符串
     */
    public static String uncapUnderline(String s) {
        if (s == null || s.isEmpty()) {
            return "";
        }

        // 预分配足够空间（避免多次扩容）
        StringBuilder ret = new StringBuilder(s.length() * 2);
        boolean lastCharLower = false;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (Character.isUpperCase(c)) {
                // 不是第一个字符且前一个字符是小写时添加下划线
                if (i > 0 && lastCharLower) {
                    ret.append('_');
                }
                ret.append(Character.toLowerCase(c));
                lastCharLower = false;
            } else {
                ret.append(c);
                lastCharLower = true;
            }
        }

        return ret.toString();
    }

    /**
     * 将首字母小写（安全高效版）
     * 如: MyClass -> myClass
     *
     * @param s 输入字符串
     * @return 转换后的字符串，如果输入为null返回空字符串
     */
    public static String uncap(String s) {
        if (s == null || s.isEmpty()) {
            return "";
        }

        // 优化单字符情况
        if (s.length() == 1) {
            return s.toLowerCase();
        }

        // 避免创建不必要的字符串
        return Character.toLowerCase(s.charAt(0)) + s.substring(1);
    }

    /**
     * 将下划线命名转换为驼峰命名（安全高效版）
     * 如: my_test_name -> myTestName
     *
     * @param str 输入字符串
     * @return 转换后的字符串，如果输入为null返回空字符串
     */
    public static String underlineToHump(String str) {
        if (str == null || str.isEmpty()) {
            return "";
        }

        // 处理无下划线的情况
        if (str.indexOf('_') == -1) {
            return uncap(str);
        }

        // 使用StringJoiner避免中间列表
        StringJoiner joiner = new StringJoiner("");
        boolean capitalizeNext = false;

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            if (c == '_') {
                capitalizeNext = true;
            } else {
                if (capitalizeNext) {
                    joiner.add(String.valueOf(Character.toUpperCase(c)));
                    capitalizeNext = false;
                } else {
                    // 第一个字符保持小写
                    if (i == 0) {
                        joiner.add(String.valueOf(Character.toLowerCase(c)));
                    } else {
                        joiner.add(String.valueOf(c));
                    }
                }
            }
        }

        return joiner.toString();
    }

    /**
     * 获取简单类名, 如 com.tlgen.spring.service.SysUserService 获取到 SysUserService
     *
     * @param className
     * @return
     */
    public static String getSimpleClassName(String className) {
        return className.substring(className.lastIndexOf(".") + 1);
    }

    public static String capitalizeFirstLetter(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        // 高性能处理：避免创建新字符串对象
        char firstChar = input.charAt(0);

        // 检查是否已是大写（避免不必要的转换）
        if (Character.isUpperCase(firstChar)) {
            return input;
        }

        // 使用字符数组操作（最高效方式）
        char[] chars = input.toCharArray();
        chars[0] = Character.toUpperCase(firstChar);

        return new String(chars);
    }

}